TÉCNICAS PARA DISMINUR LA PENALIZACIÓN DE PÉRDIDAS
ENVÍO DIRECTO DE LA PALABRA SOLICITADA AL PROCESADOR
Hasta el momento hemos supuesto que cuando se produce un fallo de lectura hay que enviar todo el bloque de información desde el nivel inferior de la jerarquía a la memoria cache. Esto hace que la espera sea elevada, sobretodo para bloques de gran tamaño. Este problema se puede evitar con el envío directo de la palabra solicitada al procesador. Existen en la actualidad dos técnicas que implementan esta política: la carga anticipada y primero la palabra solicitada.
Carga anticipada
Consistente en reanudar la ejecución del proceso tan pronto como llegue la palabra pedida. Por lo tanto no se espera la llegada completa del bloque. Ahorramos tiempo puesto que la ejecución del proceso y la transferencia del resto del bloque continúan en paralelo. Este mecanismo funciona mejor con instrucciones debido a que su carga es más secuencial.
Primero la palabra solicitada
Se organiza la memoria para que la palabra solicitada sea siempre la primera en llegar a la memoria cache. En cuanto esta palabra llega a la memoria cache, esta sigue funcionando. A continuación se transfiere el resto del bloque y se vuelve al principio del bloque.
DAR PREFERENCIA A LAS PÉRDIDAS DE LECTURA
Con la escritura directa la mejora más importante que se puede realizar es la utilización de un buffer intermedio. Este tipo de mecanismo, sin embargo complican los accesos a memoria puesto que pueden almacenar el dato actualizado de una posición que se necesita en una pérdida lectura, es decir, puede ocurrir que el dato actualizado todavía no se haya escrito en MP y por lo tanto esté en el buffer. La solución más sencilla es detener la lectura hasta que se vacía el buffer. Pero esto
aumenta mucho la penalización.
Solución: se comprueba si el dato está en el buffer y si está se recupera. Si no está se da prioridad a la lectura del dato de la memoria principal. También se puede dar prioridad a la lectura para mejorar los tiempos de espera en la post escritura. Suponer que se tiene que reemplazar un bloque modificado (dirty bit) porque se ha producido un fallo de lectura. El proceso habitual es escribir todo el bloque en su posición de memoria principal y a continuación realizar la lectura. Para dar prioridad a la lectura habría:
Depositar el bloque en un buffer intermedio
Se realiza la lectura
Se realiza la escritura.
CACHES NO BLOQUEANTES
Se utilizan para reducir las paradas en los fallos de cache. Existen máquinas segmentadas en las que la CPU no para cuando se producen fallos de cache. Esto se puede conseguir haciendo que la CPU continue buscando instrucciones en la cache de instrucciones mientras espera que la cache de datos le devuelva un fallo de datos. Las caches no bloqueantes extienden este esquema de manera que la memoria cache continua proporcionando datos mientras gestiona un fallo de lectura de datos. Esta optimización llamada "Acierto bajo fallos" reduce la penalización efectiva. Otra opción mas compleja es la llamada acierto bajo múltiples fallos o fallos bajo fallos.
Esta técnica ignora la CPU y se concentra en la interfaz entre la cache y la memoria principal. Con el aumento de la densidad de integración es posible tener una memoria cache incluida en el chip del procesador. Esta cache interna reduce la actividad del bus externo del procesador y por lo tanto reduce los tiempos de ejecución e incrementa las prestaciones globales del sistema. Los accesos a las caches internas son mucho más rápidos y el bus permanece libre para realizar otras transferencias.
En la actualidad aparte de la cache interna los sistemas tienen también caches externas. A esta estructura se le conoce como caches de dos niveles. La cache de primer nivel afecta al ciclo de reloj de la CPU y la cache de segundo nivel afecta a la penalización de una pérdida de cache. Esto tiene su importancia porque decisiones de diseño que no son aceptables en la cache de primer nivel por afectar al ciclo de reloj, si que pueden serlo para la de segundo nivel.
Por ejemplo, el primer nivel de cache debe ser lo suficientemente pequeño para emparejar con el ciclo de reloj de la CPU, mientras que el segundo nivel de cache puede ser los suficientemente grande como para capturar la mayoría de los accesos que deberían ir a la memoria principal, y de esta manera disminuir la penalización. Las características de la cache externa son:
Tamaño Grande (256KB-8MB) que disminuye la tasa de fallos de capacidad y conflicto.
Un tamaño de bloque: grande (64-512 bytes) que disminuye los fallos de inicio.
Un grado de asociatividad bajo (1-4), esto puede parecer contradictorio, pero como vimos con anterioridad Cuanto mayor es la memoria cache menos influye el grado de asociatividad en la disminución del tanto por ciento de fallos. Como las memorias de segundo nivel son muy grandes (como poco 10 veces mayores) las asociatividad no disminuye casi la tasa de fallos pero si que aumenta los tiempos de acceso y por lo tanto las penalizaciones de primer nivel.
Política de Reemplazamiento aleatorio.